﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Reflection;
using System.IO;
using System.Diagnostics;
using System.Text.RegularExpressions;
using System.Net;
using System.Threading;
using System.Web;
using System.Globalization;

namespace template_dll
{
    public partial class ChildForm : Form
    {
        public ChildForm()
        {
            InitializeComponent();
        }

        private const string namechcol = "Флаг";
        private SqlConnection conn;
        private DataTable[] dt_rep;
        private DataTable dt_result;
        private DataTable dt_noresult;
        private delegate void Deleg();

        private struct sp_params
        {
            public string name;
            public object value;
        }

        public static bool DisplayForm(System.Windows.Forms.Form theMDIParent)
        {
            ChildForm f = new ChildForm();
            f.MdiParent = theMDIParent;
            f.WindowState = FormWindowState.Maximized;
            f.Show();
            return true;
        }
        private string site = "";
        private string par = "";
        private Cookie[] cook;
        private bool connect = false;
        private string path = "";
        private int cb1_cur_index = -1;
        private DataTable[] dt_site;

        private string GetServ(string filename)
        {
            string str = "";
            using (StreamReader streamReader = new StreamReader(filename))
            {
                while (!streamReader.EndOfStream)
                {
                    str += streamReader.ReadLine();
                }
            }
            return str;
        }

        private void ChildForm_Load(object sender, EventArgs e)
        {
            try
            {
                conn = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=Competitors;Integrated Security=True");
                conn.Open();
                connect = true;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                connect = false;
            }
            finally
            {
                //connect = false;
                if (!connect) 
                {
                    MessageBox.Show("Сервер не доступен. Аналитика работает в оффлайн режиме\n");
                    FolderBrowserDialog fbd = new FolderBrowserDialog();
                    dt_site = new DataTable[1];
                    dt_site[0] = new DataTable();
                    dt_site[0].Columns.Add();
                    dt_site[0].Columns.Add();
                    if (fbd.ShowDialog() == DialogResult.OK)
                    {
                        path = fbd.SelectedPath;
                        using (StreamReader sr = new StreamReader(path + @"/site.csv"))
                        {
                            string line;
                            while ((line = sr.ReadLine()) != null)
                            {
                                if (line != "")
                                {
                                    string[] row = Regex.Split(line, "\t");
                                    if (row[0].ToString() != "siteid")
                                    {
                                        dt_site[0].Rows.Add(new object[] { row[0], row[1] });
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    dt_site = SqlProcExecWithQuery(conn, "pas_WebSiteSel", 300, null);
                }
                NewItem[] newitem = new NewItem[0];
                foreach (DataRow row in dt_site[0].Rows)
                {
                    Array.Resize(ref newitem, newitem.Length + 1);
                    newitem[newitem.Length - 1] = new NewItem();
                    newitem[newitem.Length - 1].ParamDirectoryID = Convert.ToInt32(row[0]);
                    newitem[newitem.Length - 1].ParamComment = row[1].ToString();
                    comboBox1.Items.Add(newitem[newitem.Length - 1]);
                }
                ClearAll();
            }
            
        }
        private void SqlProcExecNonQuery(SqlConnection con, string procname, int timeout, sp_params[] param)
        {
            try
            {
                if (con.State == ConnectionState.Closed) con.Open();
                SqlCommand com = con.CreateCommand();
                com.CommandType = CommandType.StoredProcedure;
                com.CommandTimeout = timeout;
                com.CommandText = procname;

                if (param != null)
                {
                    foreach (sp_params p in param)
                    {
                        com.Parameters.AddWithValue(p.name, p.value);
                    }
                }
                com.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private DataTable[] SqlProcExecWithQuery(SqlConnection con, string procname, int timeout, sp_params[] param)
        {
            DataTable[] dt = new DataTable[0];
            try
            {
                SqlCommand com = con.CreateCommand();
                com.CommandType = CommandType.StoredProcedure;
                com.CommandTimeout = timeout;
                com.CommandText = procname;

                if (param != null)
                {
                    foreach (sp_params p in param)
                    {
                        com.Parameters.AddWithValue(p.name, p.value);
                    }
                }
                SqlDataReader dr = com.ExecuteReader();
                 
                while (dr.HasRows)
                {
                    Array.Resize(ref dt, dt.Length + 1);
                    dt[dt.Length - 1] = new DataTable();
                    dt[dt.Length - 1].Load(dr);
                    if (dt[dt.Length - 1].Columns.Count > 2) dt[dt.Length - 1].TableName = dt[dt.Length - 1].Rows[0][1].ToString();
                    if (dr.IsClosed) break;
                }

                dr.Close();

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return dt;
        }

        private void ComboBoxAddItems(DataTable[] dt)
        {
            try
            {
                DataRow r;
                DataTable tmp = new DataTable();
                Point point = new Point(comboBox1.Location.X, comboBox1.Location.Y + comboBox1.Height + 10);
                try
                {
                    foreach (DataTable table in dt)
                    {
                        if (table.Columns.Count == 2)
                        {
                            site = table.Rows[0][0].ToString();
                            par = table.Rows[0][1].ToString();
                        }
                        if (table.Columns.Count > 2)
                        {
                            if (!Convert.ToBoolean(table.Rows[0][2]))
                            {
                                
                                ComboBox cb = ComboBoxAdd(point, table.Rows[0][1].ToString(), groupBox4,comboBox1.Height,comboBox1.Width);
                                point.Y += comboBox1.Height + 10;
                                NewItem[] newitem = new NewItem[0];

                                foreach (DataRow row in table.Rows)
                                {
                                    r = row;
                                    Array.Resize(ref newitem, newitem.Length + 1);
                                    newitem[newitem.Length - 1] = new NewItem();
                                    newitem[newitem.Length - 1].ParamDirectoryID = Convert.ToInt32(row[0]);
                                    newitem[newitem.Length - 1].ParamName = row[1].ToString();
                                    newitem[newitem.Length - 1].AnyValue = Convert.ToBoolean(row[2]);
                                    newitem[newitem.Length - 1].ParamValue = row[3].ToString();
                                    newitem[newitem.Length - 1].ParamComment = row[4].ToString();
                                    if (row[5] != DBNull.Value && row[5].ToString() != "" && row[5].ToString() != " ") newitem[newitem.Length - 1].ParentID = Convert.ToInt32(row[5]);
                                    newitem[newitem.Length - 1].Worked = false;
                                    cb.Items.Add(newitem[newitem.Length - 1]);
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                foreach (DataTable table in dt)
                {
                    if (table.Columns.Count > 2)
                    {
                        if (Convert.ToBoolean(table.Rows[0][2]))
                        {
                            NewItem[] newitem = new NewItem[0];
                            foreach (DataRow row in table.Rows)
                            {
                                Array.Resize(ref newitem, newitem.Length + 1);
                                newitem[newitem.Length - 1] = new NewItem();
                                newitem[newitem.Length - 1].ParamDirectoryID = Convert.ToInt32(row[0]);
                                newitem[newitem.Length - 1].ParamName = row[1].ToString();
                                newitem[newitem.Length - 1].AnyValue = Convert.ToBoolean(row[2]);
                                newitem[newitem.Length - 1].ParamValue = row[3].ToString();
                                newitem[newitem.Length - 1].ParamComment = row[4].ToString();
                                if (row[5] != DBNull.Value && row[5].ToString() != "" && row[5].ToString() != " ") newitem[newitem.Length - 1].ParentID = Convert.ToInt32(row[5]);
                                newitem[newitem.Length - 1].Worked = false;
                                bool fl = false;
                                foreach (Control contrl in comboBox1.Parent.Controls)
                                {
                                    if (contrl.GetType().ToString() == @"System.Windows.Forms.ComboBox"
                                        && contrl.Name != "comboBox1")
                                    {
                                        for (int i = 0; i < (contrl as ComboBox).Items.Count; i++)
                                        {
                                            NewItem ni = (contrl as ComboBox).Items[i] as NewItem;
                                            NewItem[] child;
                                            if (ni.children == null) child = new NewItem[0];
                                            else child = ni.children;
                                            if (ni.ParamDirectoryID == newitem[newitem.Length - 1].ParentID)
                                            {
                                                Array.Resize(ref child, child.Length + 1);
                                                child[child.Length - 1] = newitem[newitem.Length - 1];
                                                ((contrl as ComboBox).Items[i] as NewItem).children = child;
                                                fl = true;
                                                break;
                                            }
                                        }
                                    }
                                    if (fl) break;
                                }
                            }
                        }
                    }
                }
                comboBox1.Parent.Parent.Height = point.Y + 10;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private ComboBox ComboBoxAdd(Point location, string name, GroupBox gb, int height, int width)
        {
            ComboBox cb = new ComboBox();
            cb.Name = name;
            cb.Location = location;
            cb.Height = height;
            cb.Width = width;
            cb.Visible = true;
            gb.Controls.Add(cb);

            return cb;
        }
        private void StartCreateRep(object sender, EventArgs e)
        {
            //dataGridView1.DataSource = null;
            //dt_rep.Clear();
            //del = new Deleg(CreateRep);
            //this.Text += " Формируется";
            //IAsyncResult asyncRes = del.BeginInvoke(new AsyncCallback(CallBackFunc), null); //
            //panel1.Enabled = false;
            //dataGridView1.Enabled = false;
        }

        private void CallBackFunc(IAsyncResult aRes)
        {
            //del.EndInvoke(aRes);
            //panel1.Invoke((Func<bool>)(() => panel1.Enabled = true));
            //dataGridView1.Invoke((Func<bool>)(() => dataGridView1.Enabled = true));
            //this.Invoke((Func<string>)(() => this.Text = this.Text.Replace(" Формируется", "")));
            //dataGridView1.Invoke((Func<object>)(() => dataGridView1.DataSource = dt_rep.DefaultView));
        }

        private void CreateRep()
        {
            //if (conn.State == ConnectionState.Closed) conn.Open();
            //try
            //{
                
            //    dt_rep.Load(RepProc(conn));

            //    conn.Close();
            //}
            //catch (Exception ex)
            //{
            //    MessageBox.Show(ex.ToString());
            //    conn.Close();
            //}

        }

        private SqlDataReader RepProc(SqlConnection sqlcon)//метод для вызова хранимки
        {
            SqlCommand sqlcom = sqlcon.CreateCommand();
            sqlcom.CommandType = CommandType.StoredProcedure;
            sqlcom.CommandText = @"sp_name"; //имя хранимой процедуры
            sqlcom.CommandTimeout = 300;

            

            return sqlcom.ExecuteReader();
        }

        private void ExpToExcel(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.FileName = "результаты";
            sfd.Filter = "Файл CSV | *.csv";
            if (sfd.ShowDialog() == DialogResult.OK)
            {   
                SaveDGVToCSVfile(sfd.FileName.ToString(), dataGridView1, false);
                MessageBox.Show("Результат сохранен");
            }
            
        }

        public static bool SaveDGVToCSVfile(string filename, DataGridView table, bool openInExcel)
        {
            try
            {
                StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);

                List<int> col_n = new List<int>();
                foreach (DataGridViewColumn col in table.Columns)
                    if (col.Visible)
                    {
                        if (col.Index < table.ColumnCount - 1) sw.Write(col.HeaderText + "\t");
                        else sw.Write(col.HeaderText);
                        
                        col_n.Add(col.Index);
                    }
                sw.WriteLine();
                int x = table.RowCount;
                if (table.AllowUserToAddRows) x--;

                for (int i = 0; i < x; i++)
                {
                    for (int y = 0; y < col_n.Count; y++)
                        if (y < col_n.Count - 1)
                            sw.Write(table[col_n[y], i].Value.ToString() + "\t");
                        else sw.Write(table[col_n[y], i].Value.ToString());
                    sw.Write("\r\n");
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            if (openInExcel)
            {
                try
                {
                    Process newProc = Process.Start("excel.exe", "\"" + filename + "\"");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
            return true;
        }

        public static bool SaveDGVToCSVfile(string filename, DataTable table, bool openInExcel)
        {
            try
            {
                StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);

                List<int> col_n = new List<int>();
                foreach (DataColumn col in table.Columns)
                {
                    if (col.Ordinal < table.Columns.Count - 1) sw.Write(col.ColumnName + "\t");
                    else sw.Write(col.ColumnName);
                    col_n.Add(col.Ordinal);
                }
                sw.WriteLine();
                int x = table.Rows.Count;

                for (int i = 0; i < x; i++)
                {
                    for (int y = 0; y < col_n.Count; y++)
                        if (y < col_n.Count - 1)
                            sw.Write(table.Rows[i][col_n[y]] + "\t");
                        else sw.Write(table.Rows[i][col_n[y]]);
                    sw.Write("\r\n");
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            if (openInExcel)
            {
                try
                {
                    Process newProc = Process.Start("excel.exe", "\"" + filename + "\"");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
            return true;
        }

        public static bool SaveDGVToCSVfile(string filename, DataTable[] table, bool openInExcel)
        {
            try
            {
                StreamWriter sw = new StreamWriter(filename, false, Encoding.Unicode);
                foreach (DataTable tbl in table)
                {
                    List<int> col_n = new List<int>();
                    foreach (DataColumn col in tbl.Columns)
                    {
                        if (col.Ordinal < tbl.Columns.Count - 1) sw.Write(col.ColumnName + "\t");
                        else sw.Write(col.ColumnName);
                        col_n.Add(col.Ordinal);
                    }
                    sw.WriteLine();
                    int x = tbl.Rows.Count;

                    for (int i = 0; i < x; i++)
                    {
                        for (int y = 0; y < col_n.Count; y++)
                            if(y < col_n.Count - 1)
                                sw.Write(tbl.Rows[i][col_n[y]] + "\t");
                            else sw.Write(tbl.Rows[i][col_n[y]]);
                        sw.Write("\r\n");
                    }
                }
                sw.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return false;
            }

            if (openInExcel)
            {
                try
                {
                    Process newProc = Process.Start("excel.exe", "\"" + filename + "\"");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message, "Ошибка!", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                }
            }
            return true;
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            bool flag = false;
            if (dataGridView1.RowCount > 0 || dataGridView2.RowCount > 0) flag = true;
            if (flag && comboBox1.SelectedIndex != cb1_cur_index)
                if (MessageBox.Show("Все несохранненые результаты будут утеряны", "Сменить сайт?", MessageBoxButtons.YesNo) == DialogResult.Yes) flag = false;
            if(!flag)
            {
                try
                {
                    if (connect) dt_rep = SiteParamsSel(conn, (comboBox1.SelectedItem as NewItem).ParamDirectoryID);
                    else dt_rep = SiteParamsSel(path, (comboBox1.SelectedItem as NewItem).ParamDirectoryID);

                    Control[] control = new Control[0];

                    for (int i = 0; i < comboBox1.Parent.Controls.Count; i++)
                    {
                        if (comboBox1.Parent.Controls[i].Name != "comboBox1"
                            && comboBox1.Parent.Controls[i].GetType().ToString() == @"System.Windows.Forms.ComboBox")
                        {
                            Array.Resize(ref control, control.Length + 1);
                            control[control.Length - 1] = comboBox1.Parent.Controls[i];
                        }
                    }
                    foreach (Control c in control)
                    {
                        comboBox1.Parent.Controls.Remove(c);
                    }
                    ComboBoxAddItems(dt_rep);
                    cb1_cur_index = comboBox1.SelectedIndex;
                    ClearAll();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    comboBox1.SelectedIndex = cb1_cur_index;
                }
            }
            else comboBox1.SelectedIndex = cb1_cur_index;
        }

        private DataTable[] SiteParamsSel(SqlConnection sqlcon,int value)
        {
            try
            {
                sp_params[] par = new sp_params[1];
                par[0].name = "@wsid";
                par[0].value = value;
                DataTable[] dt = SqlProcExecWithQuery(sqlcon, "pas_ParamsSel", 300, par);
                return dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
        }

        private DataTable[] SiteParamsSel(string folder, int value)
        {
            try
            {
                DataTable[] dt = new DataTable[0];

                using (StreamReader sr = new StreamReader(folder + @"/" + value.ToString() + "_" + @"site.csv"))
                {
                    string line;
                    bool fl = false;
                    while ((line = sr.ReadLine()) != null)
                    {
                        string[] row = Regex.Split(line, "\t");
                        if (row[0].ToString() == "ParamDirectoryID" || row[0].ToString() == "website")
                        {
                            Array.Resize(ref dt, dt.Length + 1);
                            dt[dt.Length - 1] = new DataTable();

                            foreach (string s in row)
                            {
                                dt[dt.Length - 1].Columns.Add(s);
                                fl = true;
                            }
                        }
                        else
                        {
                            dt[dt.Length - 1].Rows.Add(row);
                            if(fl)
                                if (dt[dt.Length - 1].Columns.Count > 2)
                                {
                                    dt[dt.Length - 1].TableName = dt[dt.Length - 1].Rows[0][1].ToString();
                                    fl = false;
                                }

                        }
                    }
                }
                return dt;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
        }

        //Новый поиск
        private void button1_Click(object sender, EventArgs e)
        {
            bool fl = false;
            string site_param = par;
            string[] paramcom = new string[0];
            this.Text = "Конкуренты - Парсинг сайтов " + "****";
            dataGridView1.DataSource = null;
            dataGridView2.DataSource = null;
            //ClearAll();

            if (comboBox1.SelectedIndex > -1)
            {
                sp_params[] param = new sp_params[0];
                foreach (Control contrl in comboBox1.Parent.Controls)
                {
                    if (contrl.GetType().ToString() == @"System.Windows.Forms.ComboBox"
                        && contrl.Name != "comboBox1")
                    {
                        if ((contrl as ComboBox).SelectedIndex == -1)
                        {
                            fl = true;
                            break;
                        }
                    }
                }
                
                if (fl) MessageBox.Show("Не выбраны параметры!");
                else
                {
                    foreach (Control contrl in comboBox1.Parent.Controls)
                    {
                        if (contrl.GetType().ToString() == @"System.Windows.Forms.ComboBox"
                            && contrl.Name != "comboBox1")
                        {
                            NewItem ni = (contrl as ComboBox).SelectedItem as NewItem;
                            Array.Resize(ref param, param.Length + 1);
                            param[param.Length - 1].name = ni.ParamName + "=" + ni.ParamValue;
                            param[param.Length - 1].value = ni.ParamDirectoryID;
                            Array.Resize(ref paramcom, paramcom.Length + 1);
                            paramcom[paramcom.Length - 1] = ni.ParamComment;
                            string sp_p = param[param.Length - 1].name;
                            site_param = site_param.Replace(sp_p.Substring(0, sp_p.IndexOf("=")) + @"=***", sp_p);
                        }
                    }
                    fl = false;
                    string drugs = @"***";
                    string drugs_esc = @"***";
                    int error = 0;
                    //int flag50 = 0;
                    foreach (Control contrl in comboBox1.Parent.Controls)
                    {
                        if (contrl.GetType().ToString() == @"System.Windows.Forms.ComboBox"
                            && contrl.Name != "comboBox1")
                        {
                            if(((contrl as ComboBox).SelectedItem as NewItem).children != null)
                            {
                                int flag = 0;
                                foreach (NewItem ni in ((contrl as ComboBox).SelectedItem as NewItem).children)
                                {
                                    site_param = site_param.Replace(drugs_esc, System.Uri.EscapeDataString(ni.ParamValue));
                                    drugs_esc = System.Uri.EscapeDataString(ni.ParamValue);
                                    drugs = ni.ParamValue;

                                    if ((error < Convert.ToInt32(counterror.Text) && Convert.ToInt32(counterror.Text) > 0) || Convert.ToInt32(counterror.Text) == 0)
                                    {
                                        DataTable dt = SitePars(site, site_param, (comboBox1.SelectedItem as NewItem).ParamDirectoryID, drugs,paramcom[0]);
                                        dt.Columns.Add("ИД узла");
                                        for (int i = 0; i < dt.Rows.Count; i++)
                                            dt.Rows[i]["ИД узла"] = ((contrl as ComboBox).SelectedItem as NewItem).ParamDirectoryID;
                                        if (dt.Rows.Count > 0)
                                        {
                                            if (dt_result == null) dt_result = dt;
                                            else dt_result.Merge(dt);
                                            error = 0;
                                        }
                                        else
                                        {
                                            dt_noresult.Rows.Add(new object[6] { drugs, (comboBox1.SelectedItem as NewItem).ParamDirectoryID, site, site_param, paramcom[0], ((contrl as ComboBox).SelectedItem as NewItem).ParamDirectoryID });
                                            error++;
                                            if (Convert.ToInt32(counterror.Text) > 0)
                                            {
                                                
                                                if (error == Convert.ToInt32(counterror.Text))
                                                {
                                                    MessageBox.Show("Сайт " + counterror.Text + " раз(а) подряд вернул ошибку");
                                                }
                                            }
                                        }
                                        Thread.Sleep(Convert.ToInt32(delay.Text) * 1000); 
                                    }
                                    else
                                    {
                                        error++;
                                        dt_noresult.Rows.Add(new object[6] { drugs, (comboBox1.SelectedItem as NewItem).ParamDirectoryID, site, site_param, paramcom[0], ((contrl as ComboBox).SelectedItem as NewItem).ParamDirectoryID });
                                    }
                                    flag++;
                                    //if (flag == 5) break;
                                    this.Text = this.Text.Replace(this.Text, this.Text.Substring(0, this.Text.IndexOf("****") + 4) + flag.ToString() + "  " + drugs);
                                    this.Refresh();
                                }
                                fl = true;
                                break;
                            }
                        }
                    }
                    
                    if (!fl)
                    {
                        foreach (DataTable table in dt_rep)
                        {
                            if (table.Columns.Count > 2 && Convert.ToBoolean(table.Rows[0][2]))
                            {
                                object obbb = table.Rows[0][5];
                                if (table.Rows[0][5] == DBNull.Value || table.Rows[0][5].ToString() == "")
                                {
                                    int flag = 0;
                                    foreach (DataRow row in table.Rows)
                                    {

                                        site_param = site_param.Replace(drugs_esc, System.Uri.EscapeDataString(row[3].ToString()));//.Replace(" ", "+")
                                        drugs_esc = System.Uri.EscapeDataString(row[3].ToString());
                                        drugs = row[3].ToString();//.Replace(" ", "+");

                                        if ((error < Convert.ToInt32(counterror.Text) && Convert.ToInt32(counterror.Text) > 0) || Convert.ToInt32(counterror.Text) == 0)
                                        {
                                            DataTable dt = SitePars(site, site_param, (comboBox1.SelectedItem as NewItem).ParamDirectoryID, drugs, paramcom[0]);
                                            dt.Columns.Add("ИД узла");

                                            if (dt.Rows.Count > 0)
                                            {
                                                if (dt_result == null) dt_result = dt;
                                                else dt_result.Merge(dt);
                                                error = 0;
                                            }
                                            else
                                            {
                                                dt_noresult.Rows.Add(new object[6] { drugs, (comboBox1.SelectedItem as NewItem).ParamDirectoryID, site, site_param, paramcom[0], null });
                                                error++;
                                                if (Convert.ToInt32(counterror.Text) > 0)
                                                {
                                                    if (error == Convert.ToInt32(counterror.Text))
                                                    {
                                                        MessageBox.Show("Сайт " + counterror.Text + " раз(а) подряд вернул ошибку");
                                                    }
                                                }
                                            }
                                            Thread.Sleep(Convert.ToInt32(delay.Text) * 1000); 
                                        }
                                        else
                                        {
                                            error++;
                                            dt_noresult.Rows.Add(new object[6] { drugs, (comboBox1.SelectedItem as NewItem).ParamDirectoryID, site, site_param, paramcom[0], null });
                                        }
                                        flag++;
                                        this.Text = this.Text.Replace(this.Text, this.Text.Substring(0, this.Text.IndexOf("****") + 4) + flag.ToString() + "  " + drugs);
                                        this.Refresh();
                                    }
                                    fl = true;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
            else MessageBox.Show("Не выбран сайт!");
            if (dt_result != null)
            {
                dataGridView1.DataSource = dt_result.DefaultView;
                this.Text = "Конкуренты - Парсинг сайтов";
            }
            if (dt_noresult != null) dataGridView2.DataSource = dt_noresult.DefaultView;
        }

        //GET ЗАПРОС "REQUEST_URL" + "Encoding"
        private static string GET_0(string Url, Encoding en)
        {
            WebRequest req = WebRequest.Create(Url);
            WebResponse resp = req.GetResponse();
            req.Timeout = 10000;
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream, en);
            string Out = sr.ReadToEnd();
            sr.Close();
            req = null;
            return Out;
        }

        //GET ЗАПРОС "REQUEST_URL" + params(специфика движка ID) + "Encoding"       (like "farmani.ru")
        private static string GET_1(string Url, string Data, Encoding en)
        {
            WebRequest req = WebRequest.Create(Url + "/" + Data.Substring(5, Data.IndexOf("&test=test") - 5).Replace("%2F", "/"));
            //MessageBox.Show(Url + '/' + Data.Substring(5, Data.IndexOf("&test=test") - 5).Replace("%2F", "/"));   //(%2F - .заменить на "/" и + .уточнить подстроку (без параметра "&test=test")) ...либо научитцо обрабатывать исключение либо обойти его таким макаром...
            WebResponse resp = req.GetResponse();
            req.Timeout = 10000;
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream, en);
            string Out = sr.ReadToEnd();
            sr.Close();
            req = null;
            return Out;
        }


        private static string GET(string Url, string Data, Encoding en)
        {
            WebRequest req = WebRequest.Create(Url + "?" + Data);
            WebResponse resp = req.GetResponse();
            req.Timeout = 10000;
            Stream stream = resp.GetResponseStream();
            StreamReader sr = new StreamReader(stream, en);
            string Out = sr.ReadToEnd();
            sr.Close();
            req = null;
            return Out;
        }

        private static string GET_HTTP(string Url, string Data, Encoding en,string referer)
        {
            string Out = "";
            try
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url + "?" + Data);              
                req.Timeout = 300000;
                req.Referer = referer;
                //req.Headers.Add("X-Requested-With", "XMLHttpRequest");
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream stream = resp.GetResponseStream();
                StreamReader sr = new StreamReader(stream, en);
                Out = sr.ReadToEnd();
                sr.Close();

            }
            catch (Exception)
            {
                //MessageBox.Show(ex.Message);
                Out = "";
            }
            return Out;
        }


        private static string GET_HTTP(string Url, string Data, Encoding en, Cookie[] incook, out Cookie[] outcook)
        {
            string Out = "";
            try
            {
                HttpWebRequest req1 = (HttpWebRequest)WebRequest.Create(Url + "?" + Data);
                req1.CookieContainer = new CookieContainer();

                ////получаем куки
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url + "?" + Data);
                req.CookieContainer = new CookieContainer();
                req.Timeout = 5000;
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Stream responseStream = resp.GetResponseStream();
                incook = new Cookie[0];
                foreach (Cookie c in resp.Cookies)
                {
                    req1.CookieContainer.Add(new Uri(Url), c);
                    Array.Resize(ref incook, incook.Length + 1);
                    incook[incook.Length - 1] = c;
                }
                responseStream.Close();
                req = null;
                ////////////////////

                WebResponse resp1 = req1.GetResponse();
                req1.Timeout = 30000;
                Stream stream = resp1.GetResponseStream();
                StreamReader sr = new StreamReader(stream, en);
                Out = sr.ReadToEnd();
                sr.Close();

                outcook = incook;
            }
            catch (Exception)
            {
                Out = "";
                outcook = incook;
            }
            return Out;
        }

        private static string POST(string Url, string Data)
        {
            WebRequest req = WebRequest.Create(Url);
            req.Method = "POST";
            req.Timeout = 100000;
            req.ContentType = "application/x-www-form-urlencoded";
            byte[] sentData = Encoding.GetEncoding(1251).GetBytes(Data);
            req.ContentLength = sentData.Length;
            Stream sendStream = req.GetRequestStream();
            sendStream.Write(sentData, 0, sentData.Length);
            sendStream.Close();
            WebResponse res = req.GetResponse();
            Stream ReceiveStream = res.GetResponseStream();
            StreamReader sr = new StreamReader(ReceiveStream, Encoding.Default);
            //Кодировка указывается в зависимости от кодировки ответа сервера
            Char[] read = new Char[256];
            int count = sr.Read(read, 0, 256);
            string Out = String.Empty;
            while (count > 0)
            {
                String str = new String(read, 0, count);
                Out += str;
                count = sr.Read(read, 0, 256);
            }
            return Out;
        }

        public DataTable SitePars(string site,string param,int siteid,string drugname,string cityname)
        {
            DataTable dt = new DataTable();
            string[] str;
            try
            {
                switch (siteid)
                {
                    case 1://http://www.poisklekarstv.ru
                    #region case1
                        str = Regex.Split(GET_HTTP(site, param, Encoding.Default, site), "}");
                        string tmpstr = "";
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("Цена");
                        dt.Columns.Add("количество");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");
                        foreach (string s in str)
                        {
                            if (s.IndexOf("\"l_name\":") > -1)
                            {
                                tmpstr = s.Replace(s.Substring(0, s.IndexOf("\"l_name\":") + 10), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"manuf\":"), tmpstr.IndexOf("\"date_report\":") + 14 - tmpstr.IndexOf("\"manuf\":")), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"price\":"), 8), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"qty\":"), 6), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"city\":"), 7), "");
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"a_name\":")), tmpstr.Substring(tmpstr.IndexOf("\"a_name\":")).Replace("(", "\",\"").Replace(")", ""));
                                tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf("\"price_inc_company\":"), tmpstr.IndexOf("\"a_name\":") + 9 - tmpstr.IndexOf("\"price_inc_company\":")), "");
                                if (tmpstr.IndexOf(",\"<img") > -1) tmpstr = tmpstr.Replace(tmpstr.Substring(tmpstr.IndexOf(",\"<img"), tmpstr.IndexOf(">\",") + 2 - tmpstr.IndexOf(",\"<img")), ",\"0\"");
                                tmpstr = tmpstr.Replace("\",\"", "\t").Trim().TrimEnd('"');
                                tmpstr = tmpstr.Replace(@"&quot;", "\"");
                                string[] rowsstr = Regex.Split(tmpstr, "\t");
                                string[] rowsstr_short = new string[7];
                                for (int i = 0; i < 7; i++)
                                {
                                    rowsstr_short[i] = rowsstr[i];
                                }
                                dt.Rows.Add(rowsstr_short);
                            }
                        }
                        dt.Columns.Remove("количество");
                        dt.Columns.Add("ИД сайта");

                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["ИД сайта"] = siteid;
                        }
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        break;
                    #endregion case1
                    case 2://http://lek.nsk.ru
                    #region case2
                        string str1 = GET(site, param, Encoding.UTF8);
                        if (str1.IndexOf("Цену уточните в аптеке") > -1)
                        {
                            str1 = str1.Substring(str1.IndexOf("Цену уточните в аптеке"), str1.Length - 1 - str1.IndexOf("Цену уточните в аптеке"));
                            str1 = str1.Replace("\t", "");
                            str1 = str1.Replace("Уточнить <br/>в аптеке","0");
                            if (str1.IndexOf("<tbody>") > -1) str1 = str1.Substring(str1.IndexOf("<tbody>") + 7, str1.IndexOf("</tbody>") - str1.IndexOf("<tbody>") - 8);
                            str1 = str1.Replace("\n", "");
                            str1 = str1.Replace("</tr>", "</tr>\n");
                            str = Regex.Split(str1, "\n");
                            dt.Columns.Add("Аптека");
                            dt.Columns.Add("Адрес");
                            dt.Columns.Add("район");
                            dt.Columns.Add("телефон");
                            dt.Columns.Add("Дата");
                            dt.Columns.Add("Цена");
                            foreach (string s in str)
                            {
                                str1 = s;
                                while (str1.IndexOf("<") > -1)
                                {
                                    str1 = str1.Replace(str1.Substring(str1.IndexOf("<"), str1.IndexOf(">") - str1.IndexOf("<") + 1), "||||").Replace("||||||||", "||||").Trim('|').Trim().Replace("||||", "\t");
                                }
                                while (str1.IndexOf("\t\t") > -1)
                                {
                                    str1 = str1.Replace("\t\t", "\t");
                                }
                                try
                                {
                                    if (str1.Length > 0 && str1.IndexOf("var") == -1)
                                        if (str1.Substring(str1.Length - 2) != " 0")
                                            dt.Rows.Add(Regex.Split(str1, "\t"));
                                }
                                catch (Exception ex)
                                {
                                    MessageBox.Show(ex.Message + "\n" + str1);
                                }
                            }
                            dt.Columns.Add("Товар");
                            dt.Columns.Add("Город");
                            dt.Columns.Add("ИД сайта");

                            for (int i = 0; i < dt.Rows.Count; i++)
                            {
                                dt.Rows[i]["Товар"] = drugname;
                                dt.Rows[i]["Город"] = "Новосибирск";
                                dt.Rows[i]["Адрес"] = "р-н " + dt.Rows[i]["район"].ToString() + ", " + dt.Rows[i]["Адрес"].ToString() + ", тел. " + dt.Rows[i]["телефон"].ToString();
                                dt.Rows[i]["ИД сайта"] = siteid;
                            }

                            dt.Columns.Remove("телефон");
                            dt.Columns.Remove("район");
                            dt.Columns["Товар"].SetOrdinal(0);
                            dt.Columns["Дата"].SetOrdinal(1);
                            dt.Columns["Цена"].SetOrdinal(2);
                            dt.Columns["Город"].SetOrdinal(3);
                            dt.Columns["Аптека"].SetOrdinal(4);
                            dt.Columns["Адрес"].SetOrdinal(5);
                            dt.Columns["ИД сайта"].SetOrdinal(6);
                        }
                        break;
                    #endregion case2
                    case 3://http://www.009.am
                    #region case3
                        string sitestr = "";
                        
                        sitestr = GET_HTTP(site, param, Encoding.UTF8,cook,out cook);
                        
                        if (sitestr.IndexOf("Вы можете купить лекарства под заказ") > -1 && sitestr.IndexOf("<!-- конец последнего района") > -1) sitestr = sitestr.Substring(sitestr.IndexOf("Вы можете купить лекарства под заказ"), sitestr.IndexOf("<!-- конец последнего района") - sitestr.IndexOf("Вы можете купить лекарства под заказ"));
                        else
                        {
                            dt = new DataTable();
                            break;
                        }
                        if (sitestr.IndexOf("<div class=\"search_row") > -1) sitestr = sitestr.Substring(sitestr.IndexOf("<div class=\"search_row"));
                        while (sitestr.IndexOf("<div class=\"rayoncapt\">") > -1)
                        {
                            int i = sitestr.IndexOf("<div class=\"rayoncapt\">");
                            sitestr = sitestr.Replace(sitestr.Substring(i, sitestr.IndexOf("<div class=\"search_row", i) - i), "");
                        }
                        sitestr = sitestr.Replace("отложить", "");
                        while (sitestr.IndexOf(">") > -1 && sitestr.IndexOf("<") > -1)//
                        {
                            if (sitestr.IndexOf(">") - sitestr.IndexOf("<") > 0)
                                sitestr = sitestr.Replace(sitestr.Substring(sitestr.IndexOf("<"), sitestr.IndexOf(">") - sitestr.IndexOf("<") + 1), "||||").Replace("\t", "").Replace("\n", "");
                        }
                        sitestr = sitestr.Replace("||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||", "\n");
                        while (sitestr.IndexOf("||") > -1) 
                            sitestr = sitestr.Replace("||", "|");
                        str = Regex.Split(sitestr, "\n");
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("производитель");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");
                        dt.Columns.Add("Цена");
                        foreach (string ss in str)
                        {
                            string s = ss.Trim('|');
                            while (s.IndexOf(" |") > -1) s = s.Replace(" |", "|");
                            while (s.IndexOf("| ") > -1) s = s.Replace("| ", "|");
                            int i = 0;
                            for (int j = 0; j < 4; j++) i = s.IndexOf('|', i + 1);
                            s = s.Substring(i + 1);
                            s = s.Replace("|", "\t");
                            try
                            {
                                dt.Rows.Add(Regex.Split(s, "\t"));
                            }
                            catch (Exception)
                            {
                                MessageBox.Show(Regex.Split(s, "\t").Length.ToString());
                            }
                        }
                        dt.Columns.Remove("производитель");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("ИД сайта");
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["Город"] = cityname;
                            dt.Rows[i]["Дата"] = DateTime.Today.ToString("yyyy-MM-dd");
                            dt.Rows[i]["ИД сайта"] = siteid;
                        }

                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);
                        break;
                    #endregion case3
                    case 4://максавит//http://vps-1019641.srv.pa.infobox.ru/search.php
                    #region case4
                        string site_str = GET(site, param, Encoding.UTF8);
                        site_str = site_str.Replace(site_str.Substring(0, site_str.IndexOf(":[{") + 3), "").Replace("}]});", "");
                        site_str = DecodeEncodedNonAsciiCharacters(site_str);
                        string[] fdfd = Regex.Split(site_str, "},{");
                        string s1 = "";

                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Цена");
                        //dt.Columns.Add("Колич");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Адрес");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("ИД сайта");

                        for (int i = 0; i < fdfd.Length; i++)
                        {
                            s1 = fdfd[i];
                            object[] row = Regex.Split((s1.Substring(s1.IndexOf("\"name\":") + 8, s1.IndexOf("\"manuf\":") - 2 - (s1.IndexOf("\"name\":") + 8)) + "\t"
                                + s1.Substring(s1.IndexOf("\"price\":") + 9, s1.IndexOf("\"quantity\":") - 2 - (s1.IndexOf("\"price\":") + 9)) + "\t"
                                //+ s1.Substring(s1.IndexOf("\"quantity\":") + 11, s1.IndexOf("\"delivery\":") - 1 - (s1.IndexOf("\"quantity\":") + 11)) + "\t"
                                + s1.Substring(s1.IndexOf("\"cname\":") + 9, s1.IndexOf("\"addr\":") - 2 - (s1.IndexOf("\"cname\":") + 9)) + "\t"
                                + s1.Substring(s1.IndexOf("\">", s1.IndexOf("\"addr\":")) + 2, s1.IndexOf(@"/a>", s1.IndexOf("\"addr\":")) - 2 - (s1.IndexOf("\">", s1.IndexOf("\"addr\":")) + 2))).Replace(@"\/", @"/").Replace(@"\", "").Replace("Аптека \"Максавит\",", "") + "\t"
                                + "Максавит\t"
                                + DateTime.Today.ToString("yyyy-MM-dd") + "\t"
                                + siteid.ToString()
                                , "\t");

                            dt.Rows.Add(row);
                        }
                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);
                        break;
                    #endregion case4
                    case 6://analit.net//http://www.analit.net/apteka/Main/FindInPharmacy?filter.catalogProducts%5b0%5d=1346&filter.region=1099511627776&filter.query=АНАЛЬГИН-УЛЬТРА
                    #region case6
                        string REQUEST_str = GET(site, param, Encoding.UTF8);
                        //-----------------------------
                        // ВЫБИРАЕМ ПОДСТРОКУ МЕЖДУ ("<table class=\"drug_result" И "</html>")
                        if (REQUEST_str.IndexOf("<table class=\"drug_result") > -1 && REQUEST_str.IndexOf("</html>") > -1)
                            REQUEST_str = REQUEST_str.Substring(REQUEST_str.IndexOf("<table class=\"drug_result"), REQUEST_str.IndexOf("</html>") - REQUEST_str.IndexOf("<table class=\"drug_result"));
                        else //чтобы мусор не попадал, в строки данных, если запрос ответил, а данных не вернул
                        {
                            dt = new DataTable();
                            break;
                        }
                        //END "STAGE 1"
                        //-----------------------------
                        // ВЫБИРАЕМ ПОДСТРОКУ МЕЖДУ ("<tr class="whitetr" И "<td colspan=8>")
                        if (REQUEST_str.IndexOf("<tr class=\"whitetr") > -1 && REQUEST_str.IndexOf("<td colspan=8>") > -1)
                            REQUEST_str = REQUEST_str.Substring(REQUEST_str.IndexOf("<tr class=\"whitetr"), REQUEST_str.IndexOf("<td colspan=8>") - REQUEST_str.IndexOf("<tr class=\"whitetr"));
                        //END "STAGE 2"
                        //-----------------------------
                        //ЗАШИТА ОТ ПУСТОТ
                        REQUEST_str = REQUEST_str.Replace("<td></td>", "<td>NULL</td>");
                        //-----------------------------
                        // ЗАМЕНИТЬ СОДЕРЖИМОЕ ВСЕХ КОНТЕЙНЕРОВ НА "||||" (КОНТЕЙНЕР ОТКРЫЛСЯ = "<", КОНТЕЙНЕР ЗАКРЫЛСЯ = ">")
                        // ЗАМЕНИТЬ ВСЕ "СИМВОЛЫ ПЕРЕВОДА СТРОКИ"("\r") НА "ПУСТО"("")
                        while (REQUEST_str.IndexOf(">") > -1 && REQUEST_str.IndexOf("<") > -1)//
                        {
                            if (REQUEST_str.IndexOf(">") - REQUEST_str.IndexOf("<") > 0)
                                REQUEST_str = REQUEST_str.Replace(REQUEST_str.Substring(REQUEST_str.IndexOf("<"), REQUEST_str.IndexOf(">") - REQUEST_str.IndexOf("<") + 1), "||||").Replace("\t", "").Replace("\n", "").Replace("\r", "|");
                        }
                        //END "STAGE 3"
                        //-----------------------------
                        // ЗАМЕНИТЬ "|||||||||||||||||||||||||||" НА "СИМВОЛ ПЕРЕВОДА СТРОКИ"("\n")
                        // ЗАМЕНИТЬ ВСЕ ВХОЖДЕНИЯ "||" НА "|"
                        REQUEST_str = REQUEST_str.Replace("|||||||||||||||||||||||||||", "\n");
                        while (REQUEST_str.IndexOf("||") > -1)
                            REQUEST_str = REQUEST_str.Replace("||", "|");
                        //END "STAGE 4"
                        //-----------------------------
                        // СОЗДАЕМ МАССИВ СТРОК ПО ПРИНЦИПУ "\n"
                        str = Regex.Split(REQUEST_str, "\n");

                        //END "STAGE 5"
                        //-----------------------------
                        //ДОБАВЛЯЕМ СТОЛБЦЫ В ПЕРЕМЕННУЮ ТАБЛИЦЫ
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("район");
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("производитель");
                        dt.Columns.Add("Цена");
                        dt.Columns.Add("Адрес");
                        dt.Columns.Add("телефон");

                        //ПОСИМВОЛЬНАЯ ОБРАБОТКА КАЖДОЙ СТРОКИ МАССИВА(ДОБАВЛЯЕМ СТОЛБЦЫ ПО ПРИНЦИПУ "\t" (s.Replace("|", "\t")) )
                        foreach (string ss in str)
                        {
                            string s = ss.Trim('|');
                            while (s.IndexOf(" |") > -1) s = s.Replace(" |", "|");
                            while (s.IndexOf("| ") > -1) s = s.Replace("| ", "|");
                            int i = 0;
                            for (int j = 0; j < 7; j++)
                            {
                                i = s.IndexOf("|", i + 1);

                                //ЗАМЕНЯЕТ ГРЕБАННЫЕ "," НА "." ДЛЯ ЦЕНЫ
                                if (j == 4)
                                {
                                    s = s.Replace(",", ".");
                                }
                            }

                            s = s.Substring(i + 1);
                            s = s.Replace("|", "\t");
                            try
                            {
                                dt.Rows.Add(Regex.Split(s, "\t"));
                            }
                            catch (Exception)
                            {
                                //MessageBox.Show(Regex.Split(s, "\t").Length.ToString());
                            }
                        }
                        //УДАЛЯЕМ НЕНУЖНЫЕ СТОЛБЦЫ, ДОБАВЛЯЕМ НУЖНЫЕ
                        //dt.Columns.Remove("Товар");             //*  удаляем оригинал
                        dt.Columns.Remove("район");
                        dt.Columns.Remove("производитель");
                        dt.Columns.Remove("телефон");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("ИД сайта");
                        //dt.Columns.Add("Товар");                //* добавляем псевдотовар(цифры каталога)

                        //ДЛЯ КАЖДОГО КАРТЕЖА ПРИСВАИВАЕМ ЗНАЧЕНИЕ СТОЛБЦОВ
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["Город"] = cityname;
                            dt.Rows[i]["Дата"] = DateTime.Today.ToString("yyyy-MM-dd");
                            dt.Rows[i]["ИД сайта"] = siteid;
                            //dt.Rows[i]["Товар"] = param.Substring(param.IndexOf("&filter.catalogProducts%5b0%5d=") + 31, param.Length - param.IndexOf("&filter.catalogProducts%5b0%5d=") - 31); //filter.CurrentPage=0&filter.region=1099511627776&filter.catalogProducts%5b0%5d=69875
                        }

                        //СОРТИРУЕМ КОЛОНКИ
                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        break;
                    #endregion case6
                    case 7://irk.vapteke.ru//http://irk.vapteke.ru/ajax/SubCatalog/?ID=491&search=%D0%90%D0%BD%D0%B0%D0%BB%D1%8C%D0%B3%D0%B8%D0%BD&AptID=net220
                    #region case7
                        string REQUEST_str7 = GET(site, param, Encoding.UTF8);
                        //-----------------------------
                        //-----------------------------
                        // Если результат пуст - выходим из обработки
                        if (REQUEST_str7.IndexOf("Нет позиций") > 0)
                        {
                            dt = new DataTable();
                            break;
                        }
                        //-----------------------------
                        // ВЫБРАТЬ ПОДСТРОКУ НАЧИНАЮЩУЮСЯ НА "<td width='71' class='img' >" И ЗАКАНЧИИВАЮЩУЮСЯ НА "</table><br />"
                        REQUEST_str7 = REQUEST_str7.Substring(REQUEST_str7.IndexOf("<td width='71' class='img' >"), REQUEST_str7.IndexOf("</table><br />") - REQUEST_str7.IndexOf("<td width='71' class='img' >"));
                        //END "STAGE 1"
                        //-----------------------------
                        // ЗАШИТА ОТ ПУСТОТ
                        REQUEST_str7 = REQUEST_str7.Replace("<img src=''http://irk.vapteke.ru/templates/search/img/deliveryIcon.jpg'' width=''25'' height=''14'' onclick=''Order('delivery', 223, 13432, '240.00', event);'' class=''hand'' title=''Доставка'' />", "");
                        REQUEST_str7 = REQUEST_str7.Replace("<img src=''http://irk.vapteke.ru/templates/search/img/24Icon.png'' width=''21'' height=''17'' class=''hand'' title=''Круглосуточно'' />", "");

                        // ЗАМЕНИТЬ СОДЕРЖИМОЕ ВСЕХ КОНТЕЙНЕРОВ НА "||||" (КОНТЕЙНЕР ОТКРЫЛСЯ = "<", КОНТЕЙНЕР ЗАКРЫЛСЯ = ">")
                        // ЗАМЕНИТЬ ВСЕ "СИМВОЛЫ ПЕРЕВОДА СТРОКИ"("\r") НА "ПУСТО"("")
                        while (REQUEST_str7.IndexOf(">") > -1 && REQUEST_str7.IndexOf("<") > -1)//
                        {
                            if (REQUEST_str7.IndexOf(">") - REQUEST_str7.IndexOf("<") > 0)
                                REQUEST_str7 = REQUEST_str7.Replace(REQUEST_str7.Substring(REQUEST_str7.IndexOf("<"), REQUEST_str7.IndexOf(">") - REQUEST_str7.IndexOf("<") + 1), "||||").Replace("\t", "|").Replace("\n", "|").Replace("\r", "|");
                        }
                        //END "STAGE 2"
                        //-----------------------------
                        // ЗАМЕНИТЬ "||||||||||||||||||||||||||||||||||||||||  " НА "СИМВОЛ ПЕРЕВОДА СТРОКИ"("\n")
                        // ЗАМЕНИТЬ ВСЕ ВХОЖДЕНИЯ "||" НА "|"
                        REQUEST_str7 = REQUEST_str7.Replace("||||||||||||||||||||||||||||||||||||||||  ", "\n");
                        REQUEST_str7 = REQUEST_str7.Replace("|||||||||||||||||||||||||||||||||||||||||||", "");
                        REQUEST_str7 = REQUEST_str7.Replace("Данные от: ", "");

                        while (REQUEST_str7.IndexOf("||") > -1)
                            REQUEST_str7 = REQUEST_str7.Replace("||", "|");
                        
                        // ЗАШИТА ОТ ПУСТОТ
                        REQUEST_str7 = REQUEST_str7.Replace("|&nbsp;|  ", "");
                        //END "STAGE 3"
                        //-----------------------------
                        // СОЗДАЕМ МАССИВ СТРОК ПО ПРИНЦИПУ "\n"
                        str = Regex.Split(REQUEST_str7, "\n");
                        //END "STAGE 4"
                        //-----------------------------
                        //ДОБАВЛЯЕМ СТОЛБЦЫ В ПЕРЕМЕННУЮ ТАБЛИЦЫ
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("Цена");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");

                        //ПОСИМВОЛЬНАЯ ОБРАБОТКА КАЖДОЙ СТРОКИ МАССИВА(ДОБАВЛЯЕМ СТОЛБЦЫ ПО ПРИНЦИПУ "\t")
                        foreach (string ss in str)
                        {
                            string s = ss.Trim('|');
                            while (s.IndexOf(" |") > -1) s = s.Replace(" |", "|");
                            while (s.IndexOf("| ") > -1) s = s.Replace("| ", "|");
                            int i = 0;
                            for (int j = 0; j < 5; j++)
                            {
                                i = s.IndexOf("|", i + 1);

                                //ЗАМЕНЯЕТ ГРЕБАННЫЕ " р." НА "" ДЛЯ ЦЕНЫ
                                if (j == 2)
                                {
                                    s = s.Replace(" р.", "");
                                }
                            }

                            s = s.Substring(i + 1);
                            s = s.Replace("|", "\t");
                            try
                            {
                                dt.Rows.Add(Regex.Split(s, "\t"));
                            }
                            catch (Exception)
                            {
                                //MessageBox.Show(Regex.Split(s, "\t").Length.ToString());
                            }

                        }
                        //УДАЛЯЕМ НЕНУЖНЫЕ СТОЛБЦЫ, ДОБАВЛЯЕМ ЕЩЕ СТОЛБЦЫ
                        //dt.Columns.Remove("Товар");             //*  удаляем оригинал
                        dt.Columns.Add("Город");
                        dt.Columns.Add("ИД сайта");
                        //dt.Columns.Add("Товар");                //* добавляем псевдотовар(цифры каталога)

                        //ДЛЯ КАЖДОГО КАРТЕЖА ПРИСВАИВАЕМ ЗНАЧЕНИЕ СТОЛБЦОВ
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["Город"] = "Иркутск";//cityname;
                            dt.Rows[i]["ИД сайта"] = siteid;
                            //dt.Rows[i]["Товар"] = param.Substring(3, param.Length - param.IndexOf("&AptID=") -9 -3); //ID=13432&AptID=&search=""
                        }

                        //СОРТИРУЕМ КОЛОНКИ
                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        break;
                    #endregion case7
                    case 9://nsk.vapteke.ru//http://nsk.vapteke.ru/ajax/SubCatalog/?ID=491&search=%D0%90%D0%BD%D0%B0%D0%BB%D1%8C%D0%B3%D0%B8%D0%BD&AptID=net220
                    #region case9
                        string REQUEST_str9 = GET(site, param, Encoding.UTF8);
                        //MessageBox.Show(REQUEST_str9);
                        //-----------------------------
                        //-----------------------------
                        // Если результат пуст - выходим из обработки
                        if (REQUEST_str9.IndexOf("Нет позиций") > 0)
                        {
                            dt = new DataTable();
                            break;
                        }
                        //-----------------------------
                        // ВЫБРАТЬ ПОДСТРОКУ НАЧИНАЮЩУЮСЯ НА "<td width='71' class='img' >" И ЗАКАНЧИИВАЮЩУЮСЯ НА "</table><br />"
                        REQUEST_str9 = REQUEST_str9.Substring(REQUEST_str9.IndexOf("<td width='71' class='img' >"), REQUEST_str9.IndexOf("</table><br />") - REQUEST_str9.IndexOf("<td width='71' class='img' >"));
                        //END "STAGE 1"
                        //MessageBox.Show(REQUEST_str9);
                        //-----------------------------
                        // ЗАШИТА ОТ ПУСТОТ
                        REQUEST_str9 = REQUEST_str9.Replace("<img src=''http://irk.vapteke.ru/templates/search/img/deliveryIcon.jpg'' width=''25'' height=''14'' onclick=''Order('delivery', 223, 13432, '240.00', event);'' class=''hand'' title=''Доставка'' />", "");
                        REQUEST_str9 = REQUEST_str9.Replace("<img src=''http://irk.vapteke.ru/templates/search/img/24Icon.png'' width=''21'' height=''17'' class=''hand'' title=''Круглосуточно'' />", "");

                        // ЗАМЕНИТЬ СОДЕРЖИМОЕ ВСЕХ КОНТЕЙНЕРОВ НА "||||" (КОНТЕЙНЕР ОТКРЫЛСЯ = "<", КОНТЕЙНЕР ЗАКРЫЛСЯ = ">")
                        // ЗАМЕНИТЬ ВСЕ "СИМВОЛЫ ПЕРЕВОДА СТРОКИ"("\r") НА "ПУСТО"("")
                        while (REQUEST_str9.IndexOf(">") > -1 && REQUEST_str9.IndexOf("<") > -1)//
                        {
                            if (REQUEST_str9.IndexOf(">") - REQUEST_str9.IndexOf("<") > 0)
                                REQUEST_str9 = REQUEST_str9.Replace(REQUEST_str9.Substring(REQUEST_str9.IndexOf("<"), REQUEST_str9.IndexOf(">") - REQUEST_str9.IndexOf("<") + 1), "||||").Replace("\t", "|").Replace("\n", "|").Replace("\r", "|");
                        }
                        //END "STAGE 2"
                        //-----------------------------
                        // ЗАМЕНИТЬ "||||||||||||||||||||||||||||||||||||||||  " НА "СИМВОЛ ПЕРЕВОДА СТРОКИ"("\n")
                        // ЗАМЕНИТЬ ВСЕ ВХОЖДЕНИЯ "||" НА "|"
                        REQUEST_str9 = REQUEST_str9.Replace("||||||||||||||||||||||||||||||||||||||||  ", "\n");
                        REQUEST_str9 = REQUEST_str9.Replace("|||||||||||||||||||||||||||||||||||||||||||", "");
                        REQUEST_str9 = REQUEST_str9.Replace("Данные от: ", "");

                        while (REQUEST_str9.IndexOf("||") > -1)
                            REQUEST_str9 = REQUEST_str9.Replace("||", "|");
                        
                        // ЗАШИТА ОТ ПУСТОТ
                        REQUEST_str9 = REQUEST_str9.Replace("|&nbsp;|  ", "");
                        //END "STAGE 3"
                        //-----------------------------
                        // СОЗДАЕМ МАССИВ СТРОК ПО ПРИНЦИПУ "\n"
                        str = Regex.Split(REQUEST_str9, "\n");
                        //END "STAGE 4"
                        //-----------------------------
                        //ДОБАВЛЯЕМ СТОЛБЦЫ В ПЕРЕМЕННУЮ ТАБЛИЦЫ
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("Цена");
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");

                        //ПОСИМВОЛЬНАЯ ОБРАБОТКА КАЖДОЙ СТРОКИ МАССИВА(ДОБАВЛЯЕМ СТОЛБЦЫ ПО ПРИНЦИПУ "\t")
                        foreach (string ss in str)
                        {
                            string s = ss.Trim('|');
                            while (s.IndexOf(" |") > -1) s = s.Replace(" |", "|");
                            while (s.IndexOf("| ") > -1) s = s.Replace("| ", "|");
                            int i = 0;
                            for (int j = 0; j < 5; j++)
                            {
                                i = s.IndexOf("|", i + 1);

                                //ЗАМЕНЯЕТ ГРЕБАННЫЕ " р." НА "" ДЛЯ ЦЕНЫ
                                if (j == 2)
                                {
                                    s = s.Replace(" р.", "");
                                }
                            }

                            s = s.Substring(i + 1);
                            s = s.Replace("|", "\t");
                            try
                            {
                                dt.Rows.Add(Regex.Split(s, "\t"));
                            }
                            catch (Exception)
                            {
                                //MessageBox.Show(Regex.Split(s, "\t").Length.ToString());
                            }

                        }
                        //УДАЛЯЕМ НЕНУЖНЫЕ СТОЛБЦЫ, ДОБАВЛЯЕМ ЕЩЕ СТОЛБЦЫ
                        //dt.Columns.Remove("Товар");             //*  удаляем оригинал
                        dt.Columns.Add("Город");
                        dt.Columns.Add("ИД сайта");
                        //dt.Columns.Add("Товар");                //* добавляем псевдотовар(цифры каталога)

                        //ДЛЯ КАЖДОГО КАРТЕЖА ПРИСВАИВАЕМ ЗНАЧЕНИЕ СТОЛБЦОВ
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            dt.Rows[i]["Город"] = "Новосибирск";//cityname;
                            dt.Rows[i]["ИД сайта"] = siteid;
                            //dt.Rows[i]["Товар"] = param.Substring(3, param.Length - param.IndexOf("&AptID=") -9 - 3); //ID=13432&AptID=&search=""
                        }

                        //СОРТИРУЕМ КОЛОНКИ
                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        break;
                    #endregion case9
                    case 10:////
                    #region case10
                        dt.Columns.Add("Аптека");
                        dt.Columns.Add("Адрес");
                        dt.Columns.Add("Цена");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("ИД сайта");
                        param = param.Replace(System.Uri.EscapeDataString(drugname), HttpUtility.UrlEncode(drugname.Replace(@"/", " "), Encoding.GetEncoding(1251)));
                        string res = GET(site, param, Encoding.GetEncoding(1251));
                        int c1 = res.IndexOf(">", res.IndexOf(@"<span>Ваш город:</span>") + "<span>Ваш город:</span>".Length) + 1;
                        int c2 = res.IndexOf("</a>", c1);
                        cityname = res.Substring(c1, c2 - c1);
                        int stpos = res.IndexOf(">" + drugname + "<");
                        res = res.Substring(stpos, res.IndexOf("</li>", stpos) - stpos);

                        string[] rows = Regex.Split(res, "</tr>");
                        for (int i = 1; i < rows.Length; i++)
                        {
                            string s = rows[i];
                            if (s.IndexOf("Уточните цену в аптеке") == -1)
                            {
                                try
                                {
                                    int ph1 = s.IndexOf("</noscript>") + "</noscript>".Length;
                                    int ph2 = s.IndexOf("<noscript>", ph1);
                                    int ad1 = s.IndexOf("<p class='other'>") + "<p class='other'>".Length;
                                    int ad2 = s.IndexOf("</p>", ad1);
                                    int pr1 = s.IndexOf("<b>") + "<b>".Length;
                                    int pr2 = s.IndexOf("</b>", pr1);
                                    int dt1 = s.IndexOf(">", s.IndexOf("<p class", pr2)) + 1;
                                    int dt2 = s.IndexOf("</p>", dt1);
                                    object[] row = new object[7] 
                                    {
                                        s.Substring(ph1, ph2 - ph1).Trim(),
                                        s.Substring(ad1, ad2 - ad1).Trim(),
                                        s.Substring(pr1, pr2 - pr1).Trim().Replace(" руб.","").Replace(".",","),
                                        s.Substring(dt1, dt2 - dt1).Trim().Replace("сегодня",DateTime.Now.ToString("dd.MM.yyyy")).Replace("вчера",DateTime.Now.AddDays(-1).ToString("dd.MM.yyyy")),
                                        drugname,
                                        cityname,
                                        siteid
                                    };
                                    dt.Rows.Add(row);
                                }
                                catch (Exception)
                                {
                                }
                            }
                        }

                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        break;
                    #endregion case10
                    case 13://farmani.ru//http://farmani.ru/catalog/lekarstvennye-sredstva/abaktal-tbl-p-o-400mg-10/
                    #region case13
                        //MessageBox.Show(param);
                        //string REQUEST_str13 = GET_0("http://farmani.ru/catalog/lekarstvennye-sredstva/abaktal-tbl-p-o-400mg-10/", Encoding.UTF8);
                        string REQUEST_str13 = GET_1(site, param, Encoding.UTF8);     //типо параметр имени таблетки! тут мы получаем набор параметров вида: "name=lekarstvennye-sredstva/abaktal-tbl-p-o-400mg-10/" и преобразовываем строковый параметр в вид: site+param(-"name=") (http://farmani.ru/catalog/lekarstvennye-sredstva/abaktal-tbl-p-o-400mg-10/) т.к. набор параметров, то и будет набор адресов!
                        //string REQUEST_str13 = GET(site, Encoding.UTF8);
                        // ВЫБИРАЕМ ПОДСТРОКУ МЕЖДУ ("group.add(createPlacemark(new YMaps.GeoPoint(" И "map.addOverlay(group);")
                        if (REQUEST_str13.IndexOf("group.add(createPlacemark(new YMaps.GeoPoint(") > -1 && REQUEST_str13.IndexOf("map.addOverlay(group);") > -1)
                            REQUEST_str13 = REQUEST_str13.Substring(REQUEST_str13.IndexOf("group.add(createPlacemark(new YMaps.GeoPoint("), REQUEST_str13.IndexOf("map.addOverlay(group);") - REQUEST_str13.IndexOf("group.add(createPlacemark(new YMaps.GeoPoint("));
                        else //чтобы мусор не попадал, в строки данных, если запрос ответил, а данных не вернул
                        {
                            dt = new DataTable();
                            break;
                        }
                        //MessageBox.Show("STAGE 1");
                        //-----------------------------
                        //ЗАМЕНИТЬ СОДЕРЖИМОЕ НА ПУСТО МЕЖДУ "group.add" и "<h2>"
                        while (REQUEST_str13.IndexOf("group.add") > -1)//
                        {
                            REQUEST_str13 = REQUEST_str13.Replace(REQUEST_str13.Substring(REQUEST_str13.IndexOf("group.add"), REQUEST_str13.IndexOf("<h2>") - REQUEST_str13.IndexOf("group.add") + 4)/*количество символов "<h2>"*/, "");
                        }

                        //MessageBox.Show("STAGE 2");
                        //-----------------------------
                        // ЗАМЕНИТЬ СОДЕРЖИМОЕ ВСЕХ КОНТЕЙНЕРОВ НА "||||" (КОНТЕЙНЕР ОТКРЫЛСЯ = "<", КОНТЕЙНЕР ЗАКРЫЛСЯ = ">")
                        // ЗАМЕНИТЬ ВСЕ "СИМВОЛЫ ПЕРЕВОДА СТРОКИ"("\r") НА "ПУСТО"("")
                        while (REQUEST_str13.IndexOf(">") > -1 && REQUEST_str13.IndexOf("<") > -1)//
                        {
                            if (REQUEST_str13.IndexOf(">") - REQUEST_str13.IndexOf("<") > 0)
                                REQUEST_str13 = REQUEST_str13.Replace(REQUEST_str13.Substring(REQUEST_str13.IndexOf("<"), REQUEST_str13.IndexOf(">") - REQUEST_str13.IndexOf("<") + 1), "||||").Replace("\t", "").Replace("\n", "").Replace("\r", "|").Replace("&quot;", "");
                        }

                        //MessageBox.Show("STAGE 3");
                        //-----------------------------
                        // ЗАМЕНИТЬ ВСЕ ВХОЖДЕНИЯ "||" НА "|"
                        while (REQUEST_str13.IndexOf("||") > -1)
                            REQUEST_str13 = REQUEST_str13.Replace("||", "|");

                        //MessageBox.Show("STAGE 5");

                        //ДОПОЛНИТЕЛЬНЫЙ РАЗДЕЛИТЕЛЬ СТОЛБЦОВ ИЗ СТОЛБЦА
                        while (REQUEST_str13.IndexOf(", '") > -1)
                            REQUEST_str13 = REQUEST_str13.Replace(", '", "|");

                        //sitestr = sitestr.Replace("&quot;", " ");
                        //-----------------------------
                        // СОЗДАЕМ МАССИВ СТРОК ПО ПРИНЦИПУ "\n"
                        str = Regex.Split(REQUEST_str13, ";");
                            //str = Regex.Split(sitestr, "group.add");

                        //MessageBox.Show("STAGE 6");
                        //-----------------------------
                
                        //ДОБАВЛЯЕМ СТОЛБЦЫ В ПЕРЕМЕННУЮ ТАБЛИЦЫ
                        dt.Columns.Add("Аптека");        //+
                        dt.Columns.Add("Адрес");         //+
                        dt.Columns.Add("Телефон");       //+
                        dt.Columns.Add("add_4");         //-
                        dt.Columns.Add("add_Адрес");     //-
                        dt.Columns.Add("add_Телефон");   //-
                        dt.Columns.Add("Цена");          //+
                        dt.Columns.Add("Количество");    //-
                        dt.Columns.Add("ID");            //-

                        //ПОСИМВОЛЬНАЯ ОБРАБОТКА КАЖДОЙ СТРОКИ МАССИВА(ДОБАВЛЯЕМ СТОЛБЦЫ ПО ПРИНЦИПУ "\t" (s.Replace("|", "\t")) )
                        foreach (string ss in str)
                        {
                            string s = ss.Trim('|');

                            while (s.IndexOf(" |") > -1) s = s.Replace(" |", "|");
                            while (s.IndexOf("| ") > -1) s = s.Replace("| ", "|");

                            /*
                            int i = 0;
                            for (int j = 0; j < 9; j++)     //j = dt.colums.add.count       //немного недоганяю, что и как делает етот цикл... (.нужно разобратцо) типо зачем то сместить индекс вправо.. типо постобработка по столбцам(например в конкретном столбце заменить чето)
                            {
                                i = s.IndexOf("|", i + 1);
                            }

                            s = s.Substring(i + 1);
                            */

                            s = s.Replace("руб.'", "");
                            s = s.Replace("|", "\t");

                            if (s.IndexOf("\t")>0)
                                try
                                {
                                    dt.Rows.Add(Regex.Split(s, "\t"));
                                }
                                catch (Exception)
                                {
                                    //MessageBox.Show(Regex.Split(s, "\t").Length.ToString());
                                }
                        }

                        //УДАЛЯЕМ НЕНУЖНЫЕ СТОЛБЦЫ, ДОБАВЛЯЕМ ЕЩЕ СТОЛБЦЫ
                        dt.Columns.Remove("add_4");
                        dt.Columns.Remove("add_Адрес");
                        dt.Columns.Remove("add_Телефон");
                        dt.Columns.Remove("Количество");
                        dt.Columns.Remove("ID");
                        dt.Columns.Add("Товар");
                        dt.Columns.Add("Город");
                        dt.Columns.Add("Дата");
                        dt.Columns.Add("ИД сайта");

                        //ДЛЯ КАЖДОГО КАРТЕЖА ПРИСВАИВАЕМ ЗНАЧЕНИЕ СТОЛБЦОВ
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            //dt.Rows[i]["Товар"] = param.Substring(5, param.IndexOf("&test=test") - 5);//"lekarstvennye-sredstva/abaktal-tbl-p-o-400mg-10";//GET_0(param);
                            dt.Rows[i]["Товар"] = param.Substring(5, param.IndexOf("&test=test") - 5).Replace("%2F", "/");//"lekarstvennye-sredstva/abaktal-tbl-p-o-400mg-10";//GET_0(param);
                            dt.Rows[i]["Город"] = "см. адрес";//cityname;
                            dt.Rows[i]["Дата"] = DateTime.Today.ToString("yyyy-MM-dd");
                            dt.Rows[i]["ИД сайта"] = siteid;
                        }

                        //СОРТИРУЕМ КОЛОНКИ
                        dt.Columns["Товар"].SetOrdinal(0);
                        dt.Columns["Дата"].SetOrdinal(1);
                        dt.Columns["Цена"].SetOrdinal(2);
                        dt.Columns["Город"].SetOrdinal(3);
                        dt.Columns["Аптека"].SetOrdinal(4);
                        dt.Columns["Адрес"].SetOrdinal(5);
                        dt.Columns["ИД сайта"].SetOrdinal(6);

                        //MessageBox.Show("DONE->SUCCES");

                        break;
                    #endregion case13
                    default:
                        MessageBox.Show("Не определен ID сайта");
                        break;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return dt;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            string[] index = new string[0];
            try
            {
                if (dt_noresult.Rows.Count > 0)
                {
                    dataGridView1.DataSource = null;
                    dataGridView2.DataSource = null;
                    int error = 0;
                    int flag = 0;
                    foreach (DataRow row in dt_noresult.Rows)
                    {
                        if ((error < Convert.ToInt32(counterror.Text) && Convert.ToInt32(counterror.Text) > 0) || Convert.ToInt32(counterror.Text) == 0)
                        {
                            DataTable dt = SitePars(row[2].ToString(), row[3].ToString(), Convert.ToInt32(row[1]), row[0].ToString(),row[4].ToString());
                            dt.Columns.Add("ИД узла");
                            for (int i = 0; i < dt.Rows.Count; i++)
                                dt.Rows[i]["ИД узла"] = row["ИД узла"];
                            if (dt.Rows.Count > 0)
                            {
                                if (dt_result == null) dt_result = dt;
                                else dt_result.Merge(dt);
                                error = 0;
                                Array.Resize(ref index, index.Length + 1);
                                index[index.Length - 1] = row[0].ToString();
                            }
                            else
                            {
                                if (Convert.ToInt32(counterror.Text) > 0)
                                {
                                    error++;
                                    if (error == Convert.ToInt32(counterror.Text))
                                    {
                                        MessageBox.Show("Сайт " + counterror.Text + " раз(а) подряд вернул ошибку");
                                        break;
                                    }
                                }
                            }
                            //Thread.Sleep(5000); 
                        }
                        else error++;
                        flag++;
                        //if (flag == 5) break;
                        this.Text = this.Text.Replace(this.Text, this.Text.Substring(0, this.Text.IndexOf("****") + 4) + flag.ToString() + "  " + row[0].ToString());
                        this.Refresh();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                foreach (string s in index)
                {
                    for (int i = 0; i < dt_noresult.Rows.Count; i++)
                    {
                        if (s == dt_noresult.Rows[i][0].ToString())
                        {
                            dt_noresult.Rows.Remove(dt_noresult.Rows[i]);
                            break;
                        }
                    }
                }
                if (dt_result != null) dataGridView1.DataSource = dt_result.DefaultView;
                if (dt_noresult != null) dataGridView2.DataSource = dt_noresult.DefaultView;
                MessageBox.Show("Повторный поиск завершен");
                this.Text = "Конкуренты";
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Несохраненные данные будут утеряны.\nВы уверены, что хотите очистить форму?", "Очистить форму?", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                ClearAll();
            }
        }

        private void ClearAll()
        {
            dataGridView1.DataSource = null;
            dt_result = null;
            dataGridView2.DataSource = null;
            dt_noresult = new DataTable();
            dt_noresult.Columns.Add("Препарат");
            dt_noresult.Columns.Add("ИД сайта");
            dt_noresult.Columns.Add("Адрес сайта");
            dt_noresult.Columns.Add("Параметры запроса");
            dt_noresult.Columns.Add("Прочее");
            dt_noresult.Columns.Add("ИД узла");
        }

        private void dataGridView2_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dataGridView2.DataSource != null)
            {
                if (MessageBox.Show("Удалить строку?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
                {
                    int row = e.RowIndex;
                    string drug = dataGridView2[0, row].Value.ToString();
                    dataGridView2.DataSource = null;
                    for (int i = 0; i < dt_noresult.Rows.Count; i++)
                    {
                        if (dt_noresult.Rows[i][0].ToString() == drug)
                        {
                            dt_noresult.Rows.Remove(dt_noresult.Rows[i]);
                            break;
                        }
                    }
                    dataGridView2.DataSource = dt_noresult.DefaultView;
                    if (dataGridView2.RowCount > 0)
                    {
                        if (dataGridView2.RowCount < row) row = dataGridView2.RowCount - 1;
                        dataGridView2.CurrentCell = dataGridView2[0, row];
                    }
                }
            }
        }

        private void counterror_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!(Char.IsDigit(e.KeyChar)))
            {
                if (e.KeyChar != (char)Keys.Back)
                {
                    e.Handled = true;
                }
            }
        }

        private void counterror_Leave(object sender, EventArgs e)
        {
            if (counterror.Text == "") counterror.Text = "0";
        }

        private void dataGridView2_DataSourceChanged(object sender, EventArgs e)
        {
            if (dataGridView2.DataSource == null) toolStripStatusLabel2.Text = "";
            else toolStripStatusLabel2.Text = "Не обработано: " + dataGridView2.RowCount.ToString();
        }

        private void dataGridView1_DataSourceChanged(object sender, EventArgs e)
        {
            if (dataGridView1.DataSource == null) toolStripStatusLabel1.Text = "";
            else toolStripStatusLabel1.Text = "Результатов: " + dataGridView1.RowCount.ToString();
        }

        private void button6_Click(object sender, EventArgs e)
        {
            try
            {
                if (comboBox1.Items.Count > 0)
                {
                    DataTable dt = new DataTable();
                    dt.Columns.Add("siteid");
                    dt.Columns.Add("adds");
                    for (int i = 0; i < comboBox1.Items.Count; i++)
                    {
                        object[] row = new object[2] { (comboBox1.Items[i] as NewItem).ParamDirectoryID, (comboBox1.Items[i] as NewItem).ParamComment };
                        dt.Rows.Add(row);
                    }
                    FolderBrowserDialog folder = new FolderBrowserDialog();
                    folder.ShowNewFolderButton = true;
                    folder.RootFolder = Environment.SpecialFolder.DesktopDirectory;
                    if (folder.ShowDialog() == DialogResult.OK)
                        SaveDGVToCSVfile(folder.SelectedPath + @"/site.csv", dt, false);

                    DataTable[] dt_params;
                    for (int i = 0; i < comboBox1.Items.Count; i++)
                    {
                        dt_params = SiteParamsSel(conn, (comboBox1.Items[i] as NewItem).ParamDirectoryID);
                        SaveDGVToCSVfile(folder.SelectedPath + @"/" + (comboBox1.Items[i] as NewItem).ParamDirectoryID.ToString() + "_" + "site.csv", dt_params, false);
                    }

                    MessageBox.Show("Справочники сохранены");
                    dt = null;
                    dt_params = null;
                    folder = null;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            SaveFileDialog sfd = new SaveFileDialog();
            sfd.FileName = "необработанные товары";
            sfd.Filter = "Файл CSV | *.csv";
            if (sfd.ShowDialog() == DialogResult.OK)
                SaveDGVToCSVfile(sfd.FileName.ToString(), dataGridView2, false);
            sfd = null;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            try
            {
                bool flag = false;
                if (dataGridView1.RowCount > 0 || dataGridView2.RowCount > 0) flag = true;
                if (flag)
                    if (MessageBox.Show("Несохраненные данные будут утеряны.\nВы уверены, что хотите очистить форму?", "Очистить форму?", MessageBoxButtons.YesNo) == DialogResult.Yes) flag = false;
                if (!flag)
                {
                    ClearAll();
                    OpenFileDialog ofd = new OpenFileDialog();
                    ofd.Filter = "Файл CSV | *.csv";
                    if (ofd.ShowDialog() == DialogResult.OK)
                    {
                        using (StreamReader sr = new StreamReader(ofd.FileName))
                        {
                            bool fl = false;
                            string line;
                            while ((line = sr.ReadLine()) != null)
                            {
                                if (line != "")
                                {
                                    string[] row = Regex.Split(line, "\t");
                                    if (!fl)
                                    {
                                        dt_noresult = new DataTable();
                                        foreach (string s in row)
                                            dt_noresult.Columns.Add(s);
                                        fl = true;
                                    }
                                    else
                                    {
                                        dt_noresult.Rows.Add(row);
                                    }
                                }
                            }
                        }
                        if (dt_noresult != null)
                        {
                            if (dt_noresult.Columns.Count == 6)
                            {
                                if (dt_noresult.Columns[0].ColumnName != "Препарат" ||
                                    dt_noresult.Columns[1].ColumnName != "ИД сайта" ||
                                    dt_noresult.Columns[2].ColumnName != "Адрес сайта" ||
                                    dt_noresult.Columns[3].ColumnName != "Параметры запроса" ||
                                    dt_noresult.Columns[4].ColumnName != "Прочее" ||
                                    dt_noresult.Columns[5].ColumnName != "ИД узла")
                                {
                                    dt_noresult = null;
                                    MessageBox.Show("Некорректный файл");
                                }
                            }
                            else
                            {
                                dt_noresult = null;
                                MessageBox.Show("Некорректный файл");
                            }
                        }
                        else MessageBox.Show("Нет данных");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (dt_noresult != null) dataGridView2.DataSource = dt_noresult.DefaultView;
            }
        }

        private void button9_Click(object sender, EventArgs e)
        {
            try
            {
                bool flag = false;
                if (dataGridView1.RowCount > 0 || dataGridView2.RowCount > 0) flag = true;
                if (flag)
                    if (MessageBox.Show("Несохраненные данные будут утеряны.\nВы уверены, что хотите очистить форму?", "Очистить форму?", MessageBoxButtons.YesNo) == DialogResult.Yes) flag = false;
                if (!flag)
                {
                    ClearAll();
                    OpenFileDialog ofd = new OpenFileDialog();
                    ofd.Filter = "Файл CSV | *.csv";
                    if (ofd.ShowDialog() == DialogResult.OK)
                    {
                        using (StreamReader sr = new StreamReader(ofd.FileName))
                        {
                            bool fl = false;
                            string line;
                            while ((line = sr.ReadLine()) != null)
                            {
                                if (line != "")
                                {
                                    string[] row = Regex.Split(line, "\t");
                                    if (!fl)
                                    {
                                        dt_result = new DataTable();
                                        foreach (string s in row)
                                        {
                                            dt_result.Columns.Add(s);
                                        }
                                        fl = true;
                                    }
                                    else
                                    {
                                        dt_result.Rows.Add(row);
                                    }
                                }
                            }
                        }
                        if (dt_result != null)
                        {
                            if (dt_result.Columns.Count == 8)
                            {
                                if (dt_result.Columns[0].ColumnName != "Товар" ||
                                    dt_result.Columns[1].ColumnName != "Дата" ||
                                    dt_result.Columns[2].ColumnName != "Цена" ||
                                    dt_result.Columns[3].ColumnName != "Город" ||
                                    dt_result.Columns[4].ColumnName != "Аптека" ||
                                    dt_result.Columns[5].ColumnName != "Адрес" ||
                                    dt_result.Columns[6].ColumnName != "ИД сайта" ||
                                    dt_result.Columns[7].ColumnName != "ИД узла")
                                {
                                    dt_result = null;
                                    MessageBox.Show("Некорректный файл");

                                }
                            }
                            else
                            {
                                dt_result = null;
                                MessageBox.Show("Некорректный файл");
                            }
                        }
                        else MessageBox.Show("Нет данных");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                if (dt_result != null) dataGridView1.DataSource = dt_result.DefaultView;
            }
        }

        private void button8_Click(object sender, EventArgs e)
        {
            try
            {
                if (connect)
                {
                    sp_params[] p = new sp_params[1];
                    p[0].name = "@comprice";
                    p[0].value = dt_result;
                    SqlProcExecNonQuery(conn, "pas_CompPriceIns", 600, p);
                    MessageBox.Show("Данные сохранены в базе");
                }
                else MessageBox.Show("База недоступна");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button10_Click(object sender, EventArgs e)
        {
            try
            {
                if (connect)
                {
                    Form2 f2 = new Form2();
                    f2.dt_site = dt_site;
                    f2.conn = conn;
                    f2.con_pharmolapdw = new SqlConnection(@"Server=" + GetServ("serv.txt") + ";Database=PharmOLAPDW;Integrated Security=True");
                    f2.ShowDialog();
                    f2.Close();
                    f2 = null;
                }
                else MessageBox.Show("База недоступна");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


        private void SiteMaksavit()
        {
            DataTable dt_maks = new DataTable();
            dt_maks.Columns.Add("name");
            dt_maks.Columns.Add("price");
            dt_maks.Columns.Add("quantity");
            dt_maks.Columns.Add("cname");
            dt_maks.Columns.Add("addr");
            List<char> abc = newABC();
            string ex = "";
            for (int ii = 0; ii < abc.Count; ii++)
            {
                try
                {
                    string site_param_first = "jtStartIndex=0&jtPageSize=1&callback=localJsonpCallback&city_id=108&lname="
                        + System.Uri.EscapeDataString(abc[ii].ToString());
                    string sitestr_first = GET("http://vps-1019641.srv.pa.infobox.ru/search.php", site_param_first, Encoding.UTF8);
                    int cntlek = Convert.ToInt32(sitestr_first.Substring(sitestr_first.IndexOf("\"TotalRecordCount\":") + 19, sitestr_first.IndexOf("\"Records\":") - 1 - (sitestr_first.IndexOf("\"TotalRecordCount\":") + 19)));

                    int fl = cntlek / 30000 + 1;
                    for (int j = 0; j < fl; j++)
                    {
                        string site_param = "jtStartIndex=" + (j * 30000).ToString() + "&jtPageSize=30000&callback=localJsonpCallback&city_id=108&lname="
                            + System.Uri.EscapeDataString(abc[ii].ToString());
                        string sitestr = GET("http://vps-1019641.srv.pa.infobox.ru/search.php", site_param, Encoding.UTF8);
                        sitestr = sitestr.Replace(sitestr.Substring(0, sitestr.IndexOf(":[{") + 3), "").Replace("}]});", "");
                        sitestr = DecodeEncodedNonAsciiCharacters(sitestr);
                        string[] fdfd = Regex.Split(sitestr, "},{");
                        string s = "";
                        for (int i = 0; i < fdfd.Length; i++)
                        {
                            s = fdfd[i];
                            object[] row = Regex.Split((s.Substring(s.IndexOf("\"name\":") + 8, s.IndexOf("\"manuf\":") - 2 - (s.IndexOf("\"name\":") + 8)) + "\t"
                                + s.Substring(s.IndexOf("\"price\":") + 9, s.IndexOf("\"quantity\":") - 2 - (s.IndexOf("\"price\":") + 9)) + "\t"
                                + s.Substring(s.IndexOf("\"quantity\":") + 11, s.IndexOf("\"delivery\":") - 1 - (s.IndexOf("\"quantity\":") + 11)) + "\t"
                                + s.Substring(s.IndexOf("\"cname\":") + 9, s.IndexOf("\"addr\":") - 2 - (s.IndexOf("\"cname\":") + 9)) + "\t"
                                + s.Substring(s.IndexOf("\">", s.IndexOf("\"addr\":")) + 2, s.IndexOf(@"/a>", s.IndexOf("\"addr\":")) - 2 - (s.IndexOf("\">", s.IndexOf("\"addr\":")) + 2))).Replace(@"\/", @"/").Replace(@"\", "")
                                , "\t");

                            dt_maks.Rows.Add(row);
                        }
                    }
                    SqlCommand proc = conn.CreateCommand();
                    proc.CommandType = CommandType.StoredProcedure;
                    proc.CommandTimeout = 300;
                    proc.CommandText = "pas_maks";
                    proc.Parameters.AddWithValue("@maks", dt_maks);
                    proc.ExecuteNonQuery();

                }
                catch (Exception)
                {
                    ex += abc[ii] + "\n";
                }
                finally
                {
                    dt_maks.Clear();
                }
            }

        }

        static string DecodeEncodedNonAsciiCharacters(string value)
        {
            return Regex.Replace(
                value,
                @"\\u(?<Value>[a-zA-Z0-9]{4})",
                m =>
                {
                    return ((char)int.Parse(m.Groups["Value"].Value, NumberStyles.HexNumber)).ToString();
                });
        }

        private List<char> newABC()
        {
            List<char> abc = new List<char>();

            abc.Add('a'); abc.Add('b'); abc.Add('c'); abc.Add('d'); abc.Add('e');
            abc.Add('f'); abc.Add('g'); abc.Add('h'); abc.Add('i'); abc.Add('j');
            abc.Add('k'); abc.Add('l'); abc.Add('m'); abc.Add('n'); abc.Add('o');
            abc.Add('p'); abc.Add('q'); abc.Add('r'); abc.Add('s'); abc.Add('t');
            abc.Add('u'); abc.Add('v'); abc.Add('w'); abc.Add('x'); abc.Add('y');
            abc.Add('z');

            abc.Add('а'); abc.Add('б'); abc.Add('в'); abc.Add('г'); abc.Add('д');
            abc.Add('е'); abc.Add('ё'); abc.Add('ж'); abc.Add('з'); abc.Add('и');
            abc.Add('й'); abc.Add('к'); abc.Add('л'); abc.Add('м'); abc.Add('н');
            abc.Add('о'); abc.Add('п'); abc.Add('р'); abc.Add('с'); abc.Add('т');
            abc.Add('у'); abc.Add('ф'); abc.Add('х'); abc.Add('ц'); abc.Add('ч');
            abc.Add('ш'); abc.Add('щ'); abc.Add('ъ'); abc.Add('ы'); abc.Add('ь');
            abc.Add('э'); abc.Add('ю'); abc.Add('я');

            return abc;
        }

    }


}
